package br.ucb.mercadojogador.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.ucb.mercadojogador.beans.Jogador;
import br.ucb.mercadojogador.beans.Time;
import br.ucb.mercadojogador.connection.FactoryConnection;
import br.ucb.mercadojogador.enums.EnumTipo;

public class JogadorDAOImpl implements JogadorDAO{

	@Override
	public void insertJogador(Jogador jogador) {
		
		Connection con = FactoryConnection.getConnection();
		PreparedStatement ps = null;
		String sql = "INSERT INTO JOGADOR VALUES (?,?,?,?,?,?,?,?,?);";
		try {
			ps = con.prepareStatement(sql);
			ps.setInt(1,0);
			ps.setString(2,jogador.getNome());
			Date date = new Date(jogador.getDataNasc().getTime());
			ps.setDate(3,date);
			ps.setInt(4,EnumTipo.findTipoByDescricao(jogador.getTipo()));
			ps.setInt(5,jogador.getGolsF());
			ps.setInt(6,jogador.getAssistencia());
			ps.setInt(7,jogador.getGolsC());
			ps.setDouble(8,jogador.getPreco());
			ps.setInt(9,jogador.getTime().getIdTime());
			ps.execute();		
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null)
					ps.close();
				if(con!=null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}	
		}
	}

	@Override
	public void deleteJogador(int idJogador) {
		Connection con = FactoryConnection.getConnection();
		PreparedStatement ps = null;
		String sql = "DELETE FROM JOGADOR WHERE idJogador=?;";
		
		try {
			ps = con.prepareStatement(sql);
			ps.setInt(1,idJogador);
			ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null)
					ps.close();
				if(con!=null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}		
	}

	@Override
	public void updateJogador(Jogador jogador) {
		Connection con = FactoryConnection.getConnection();
		PreparedStatement ps = null;
		String sql = "UPDATE JOGADOR SET nome=?, dataNasc=?, tipo=?, golsF=?, assistencia=?, golsC=?, preco=?, time_idTime=? WHERE idJogador=?;";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1,jogador.getNome());
			Date date = new Date(jogador.getDataNasc().getTime());
			ps.setDate(2,date);
			ps.setInt(3,EnumTipo.findTipoByDescricao(jogador.getTipo()));
			ps.setInt(4,jogador.getGolsF());
			ps.setInt(5,jogador.getAssistencia());
			ps.setInt(6,jogador.getGolsC());
			ps.setDouble(7,jogador.getPreco());
			ps.setInt(8,jogador.getTime().getIdTime());
			ps.setInt(9,jogador.getIdJogador());
			ps.execute();		
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null)
					ps.close();
				if(con!=null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}	
		}
		
	}

	@Override
	public List<Jogador> findAllJogadores() {
		Connection con = FactoryConnection.getConnection();
		PreparedStatement ps = null;
		String sql = "SELECT * FROM JOGADOR;";
		ArrayList<Jogador> jogadores = new ArrayList<Jogador>();
		Jogador jogador = null;
		
		try {
			ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while(rs.next()){
				jogador = new Jogador();
				putJogador(rs,jogador);
				jogadores.add(jogador);				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null)
					ps.close();
				if(con!=null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}		
		return jogadores;
	}
	
	private void putJogador(ResultSet rs, Jogador jogador) throws SQLException{
		jogador.setIdJogador(rs.getInt("IDJOGADOR"));
		jogador.setNome(rs.getString("NOME"));
		jogador.setDataNasc(rs.getDate("DATANASC"));
		jogador.setTipo(EnumTipo.findDescricaoByTipo(rs.getInt("TIPO")));
		jogador.setGolsF(rs.getInt("GOLSF"));
		jogador.setAssistencia(rs.getInt("ASSISTENCIA"));
		jogador.setGolsC(rs.getInt("GOLSC"));
		jogador.setPreco(rs.getDouble("PRECO"));
		jogador.setTime(getTime(rs.getInt("TIME_IDTIME")));
		
	}
	
	private Time getTime(int idTime){
		TimeDAO timeDao = new TimeDAOImpl();
		Time time = timeDao.consultar(idTime);
		return time;
	}

}
